function [RX_Output_Frames fadingSymbols, MSE_Real, MSE, OUT_Channel_OUT] = DFE_Equalizer(RX_IN_Filtered,...
    First_Sample_Index,Oversample, N_Frames,Rate,EsNoRatio, Original_RX_IN,...
    Hard, N1,N2, Original_Start)


%%
% ************************************************************* %
% *********************** Parameters **************************** %
% ************************************************************* %
start = First_Sample_Index ;
Original_Start_used = (Original_Start + 1) + (184 + 103) * Oversample;
% ************************************************************* %

%%
% ************************************************************* %
% *********************** Data Preparation ************************* %
% ************************************************************* %
Current_Tranining_toEqualize = RX_IN_Filtered(start-31*Oversample : start-1);
Current_Frame_toEqualize = RX_IN_Filtered(start : start+256*Oversample-1);
Data_After = RX_IN_Filtered(start+256*Oversample : start+256*Oversample+100*Oversample-1);
Original_Current_Frame = Original_RX_IN(Original_Start_used-(31*Oversample) : Original_Start_used+256*Oversample-1+(100*Oversample));
% ************************************************************* %

%%
% ************************************************************* %
% ********************** Equalization ***************************** %
% ************************************************************* %
[RX_Output_Frames(1,:) OUT_Channel] = HF_MMSE_General(Current_Frame_toEqualize, Current_Tranining_toEqualize, Data_After,...
    Oversample, EsNoRatio, Original_Current_Frame, Rate, Hard, N1, N2);

OUT_Channel_OUT = OUT_Channel;
fadingSymbols(1,:) = sum(abs(OUT_Channel).^2);
% ************************************************************* %

%%
for frame_index =2 :N_Frames
    
    if mod(frame_index-1,72) == 0 
        start = start + (256 + 103)*Oversample;
        Original_Start_used = Original_Start_used + (256 + 103)*Oversample;
    else           
        start = start + (256 + 31)*Oversample ;
        Original_Start_used = Original_Start_used + (256 + 31)*Oversample ;
    end
        
    % Data Preparation
    % ---------------------
    Current_Tranining_toEqualize = RX_IN_Filtered(start-31*Oversample:start-1);
    Current_Frame_toEqualize = RX_IN_Filtered(start:start+256*Oversample-1);
    Data_After = RX_IN_Filtered(start+256*Oversample:start+256*Oversample+100*Oversample-1);
    Original_Current_Frame = Original_RX_IN(Original_Start_used-(31*Oversample):Original_Start_used+256*Oversample-1+(100*Oversample));
    % *********************************************************** %
    
    % Equalization
    % ---------------
    [RX_Output_Frames(frame_index,:) OUT_Channel] = HF_MMSE_General(Current_Frame_toEqualize,...
        Current_Tranining_toEqualize, Data_After, Oversample, EsNoRatio, Original_Current_Frame, Rate,...
        Hard, N1, N2);

    OUT_Channel_OUT = [OUT_Channel_OUT OUT_Channel];
    fadingSymbols(frame_index,:) = sum(abs(OUT_Channel).^2);
    % *********************************************************** %
    
end

MSE_Real =ones(72,256);
MSE = ones(72,1);

end




















